package es.decloud.webapp.action;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.view.ViewScoped;

import org.apache.commons.collections.ListUtils;
import org.primefaces.model.DualListModel;

import es.decloud.model.Alumno;
import es.decloud.model.Aula;
import es.decloud.model.Centro;
import es.decloud.model.Usuario;
import es.decloud.service.AlumnoManager;
import es.decloud.service.AulaManager;
import es.decloud.service.CentroManager;
import es.decloud.service.UserManager;

@ManagedBean
@ViewScoped
public class AulaAction extends BasePage implements Serializable {

	private static final long serialVersionUID = 1398091299052909538L;

	private static final Integer TAB_LISTADO = 0; // por defecto
	private static final Integer TAB_DETALLE = 1;

	private Integer activeTab = TAB_LISTADO;

	private Aula aula = new Aula();

	private String id;
	private Long idCentro;

	private DualListModel<Usuario> educadoras;
	private DualListModel<Alumno> alumnos;

	@ManagedProperty(value = "#{aulaManager}")
	private AulaManager aulaManager;

	@ManagedProperty(value = "#{userManager}")
	private UserManager userManager;

	@ManagedProperty(value = "#{alumnoManager}")
	private AlumnoManager alumnoManager;

	@ManagedProperty(value = "#{centroManager}")
	private CentroManager centroManager;

	public void setAulaManager(AulaManager aulaManager) {
		this.aulaManager = aulaManager;
	}

	public void setAlumnoManager(AlumnoManager alumnoManager) {
		this.alumnoManager = alumnoManager;
	}

	public void setUserManager(UserManager userManager) {
		this.userManager = userManager;
	}

	public void setCentroManager(CentroManager centroManager) {
		this.centroManager = centroManager;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Aula getAula() {
		return aula;
	}

	public void setAula(Aula aula) {
		this.aula = aula;
	}

	public Long getIdCentro() {
		return idCentro;
	}

	public void setIdCentro(Long idCentro) {
		this.idCentro = idCentro;
	}

	public void setAlumnos(DualListModel<Alumno> alumnos) {
		this.alumnos = alumnos;
	}

	public Integer getActiveTab() {
		return activeTab;
	}

	public void setActiveTab(Integer activeTab) {
		this.activeTab = activeTab;
	}

	@SuppressWarnings("unchecked")
	public DualListModel<Usuario> getEducadoras() {
		if (educadoras == null) {
			// Obtenemos las educadoras para rellenar el picklist
			List<Usuario> educadorasAula = new ArrayList<>(aula.getEducadoras());
			List<Usuario> educadorasCentro = userManager.getEducadoras(aula.getCentro().getId());
			this.educadoras = new DualListModel<>(ListUtils.subtract(educadorasCentro, educadorasAula), educadorasAula);
		}

		return educadoras;
	}

	public void setEducadoras(DualListModel<Usuario> educadoras) {
		this.educadoras = educadoras;
	}

	@SuppressWarnings("unchecked")
	public DualListModel<Alumno> getAlumnos() {
		if (alumnos == null) {
			// Obtenemos los alumnos para rellenar el picklist
			List<Alumno> alumnosAula = new ArrayList<>(aula.getAlumnos());
			List<Alumno> alumnosCentro = new ArrayList<>(alumnoManager.getAlumnosCentro(aula.getCentro().getId()));
			this.alumnos = new DualListModel<>(ListUtils.subtract(alumnosCentro, alumnosAula), alumnosAula);
		}

		return alumnos;
	}

	public AulaAction() {
		setSortColumn("nombre");
	}

	public void add() {
		aula = new Aula();

		// Asignamos el centro a el aula
		// Si NO es un administrador, creamos el aula con el centro del usuario
		// En caso de el administrador, obtenemos el centro del id seleccionado
		// en el desplegable
		if (!isAdmin())
			aula.setCentro(getLoggedUser().getCentro());
		else
			aula.setCentro(centroManager.get(idCentro));

		aula.setEducadoras(new HashSet<Usuario>());
		aula.setAlumnos(new HashSet<Alumno>());

		// Cambiamos el tab
		this.activeTab = TAB_DETALLE;
	}

	public String edit(Aula aula) {
		// Informamos el aula que viene por parametro
		this.aula = aula;

		return "edit";
	}

	public String cancel() {
		if (log.isDebugEnabled()) {
			log.debug("Entering 'cancel' method");
		}

		// Eliminamos los datos
		aula = null;

		return "cancel";
	}

	public String delete() {
		// Volvemos a obtener los datos del aula de base de datos
		// aula = aulaManager.get(aula.getId());

		if (aula != null) {
			// Comprobamos que no tenga alumnos asignados
			Set<Alumno> alumnos = aula.getAlumnos();

			if (alumnos != null && alumnos.size() > 0) {
				// El aula no está vacía y por lo tanto no se puede borrar
				addError("aula.tieneAlumnos");
				return "editAula";
			}

			// Borrando...
			aulaManager.removeAula(aula.getId());

			// Debug
			log.debug("Aula eliminada, con id: " + aula.getId());

			// Mensaje al usuario
			addMessage("aula.deleted", aula.getNombre());
		}
		else
			log.debug("No se puede borrar (no encontrado) el aula con id: " + aula.getId());

		return "list";
	}

	public String save() {
		// // Obtenemos el centro y lo anexamos
		// aula.setCentro(centroManager.get(idCentro));

		// TODO: incorporar las educadoras
		aula.setEducadoras(new HashSet<Usuario>(getEducadoras().getTarget()));

		// TODO: incorporar los alumnos
		aula.setAlumnos(new HashSet<Alumno>(getAlumnos().getTarget()));

		// Guardamos el aula en base de datos
		aulaManager.saveAula(aula);

		// Mensaje al usuario
		addMessage("aula.saved");

		return "list";
	}

	@SuppressWarnings("unchecked")
	public List<Aula> getAulas() {
		if (!isAdmin()) {
			// Obtenemos el centro al que está asociado el usuario en base de
			// datos
			Centro centro = getLoggedUser().getCentro();

			// Si tiene centro asociado informamos su id para hacer la consulta
			// en BBDD
			idCentro = (centro != null) ? centro.getId() : null;
		}

		// Accedemos a por la lista de aulas solo si tenemos el id del centro
		return (idCentro != null && idCentro > 0) ? sort(aulaManager.getAulas(idCentro.toString())) : Collections
				.emptyList();
	}
}
